package com.zhuang.chapter02;

import java.util.HashMap;
import java.util.Scanner;

public class Test {
	public static void main(String[] args) {
		count();
		jude();
		printPrime();
		circle();
	}

	public static int factorial(int n) {
		if (n == 1) {
			return 1;
		}
		return n * factorial(n - 1);
	}

	// 编程求1+2!+3!+…+10! 的和。
	public static void count() {
		int sum = 0;
		for (int i = 1; i <= 10; i++) {
			sum += factorial(i);
		}
		System.out.println("1+2!+3!+…+10!的和" + sum);
	}

	public static void jude() {
		System.out.println("输入一个年月，格式如下 2001.8");

		@SuppressWarnings("resource")
		Scanner scanner = new Scanner(System.in);
		String string = scanner.nextLine();
		String[] split = string.split("\\.");

		if (judgeYear(Integer.parseInt(split[0]))) {
			System.out.println(Integer.parseInt(split[0]) + "年是闰年");
			if (Integer.parseInt(split[1]) == 2) {
				System.out.println(Integer.parseInt(split[1]) + "月" + judgeMonth(Integer.parseInt(split[1])) + 1 + "天");
			}
		} else {
			System.out.println(Integer.parseInt(split[0]) + "不是闰年");
			System.out.println(Integer.parseInt(split[1]) + "月" + judgeMonth(Integer.parseInt(split[1])) + "天");
		}
	}

	// 编程计算某年某月有几天。其中判别闰年的条件是： 能被4整除但不能被100整除的年是闰年，能被400整除的年也是闰年。（要求年月值是通过输入产生）
	public static boolean judgeYear(int year) {
		return year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ? true : false;
	}

	public static int judgeMonth(int month) {
		HashMap<Integer, Integer> map = new HashMap<>();
		map.put(1, 31);
		map.put(2, 28);
		map.put(3, 31);
		map.put(4, 30);
		map.put(5, 31);
		map.put(6, 30);
		map.put(7, 31);
		map.put(8, 31);
		map.put(9, 30);
		map.put(10, 31);
		map.put(11, 30);
		map.put(12, 31);
		return map.get(month);
	}

	// 判断是否素数
	public static boolean isPrime(int n) {
		for (int i = 2; i < Math.sqrt(n); i++) {
			if (n % i == 0) {
				return false;
			}
		}
		return true;
	}

	// 编写程序，找出100～200之间的所有素数。
	public static void printPrime() {
		for (int i = 100; i <= 200; i++) {
			if (isPrime(i)) {
				System.out.println(i);
			}
		}
	}

	// 请设计程序计算一个球从100米高度自由落下，每次落地后反跳回原高度的一半；再落下。求它在第10次落地时，共经过多少米？第10次反弹多高？
	public static void circle() {
		double total_m = 100.0;
		double total_sum = 0.0;
		for (int i = 0; i < 10; i++) {
			total_sum += total_m;
			total_m /= 2;
			total_sum += total_m;
		}
		total_sum -= total_m;
		System.out.printf("小球总共经历%f米, 第10次反弹%f米\n", total_sum, total_m);
	}
}
